/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-通用能力封装层-简化POI的原生API使用
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.poi;

import lombok.extern.slf4j.Slf4j;

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;

/**
 * 描述：定义Excel单元格的样式
 * 日期：2022-02-28
 * 作者：周孝兵
 */
@Slf4j
public class ExcelStyle {
// CHECKSTYLE:OFF

    /**
     * 设置默认的Sheet对象
     */
    public static void setDefaultSheetStyle(Sheet sheet) {
        // 设置缺省行高
        sheet.setDefaultRowHeightInPoints(24);
        // 设置缺省列宽
        sheet.setDefaultColumnWidth(24);
    }

    /**
     * 设置Excel单元格样式，合并单元格
     */
    public static void setDefaultTitleCellStyle(Sheet sheet) {
        // Sheet页的名称
        String sheetName = sheet.getSheetName();
        // 第一行是表头
        Row row = sheet.getRow(sheet.getFirstRowNum());
        log.info("当前Sheet页'{}' 第{}行 共{}列", sheetName, sheet.getFirstRowNum(), row.getPhysicalNumberOfCells());
        // 设置表头高度
        row.setHeight((short) (28 * 20));

        int lastRowNum = sheet.getLastRowNum();
        log.info("当前Sheet页'{}'的总行数：{}", sheetName, lastRowNum);
        int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
        log.info("当前Sheet页'{}'的总列数：{}", sheetName, physicalNumberOfRows);

        // 冻结前#Row.getPhysicalNumberOfCells()列，前1行（一般是固定标题，这里可以使用常量）
        sheet.createFreezePane(0, 1, 0, 1); // 冻结前1行，不冻结列
        //sheet.createFreezePane(16, 1, 16, 1); // 冻结前1行，冻结前16列

        // 获取当前Sheet页所在的工作薄
        Workbook workbook = sheet.getWorkbook();

        // 配置字体样式
        Font cellFont = workbook.createFont();
        cellFont.setFontName("黑体"); // 字体应用到当前单元格上
        cellFont.setColor(IndexedColors.WHITE.getIndex()); // 将字体设置为“白色”
        cellFont.setFontHeightInPoints((short) 14); // 将字体大小设置为14px
        cellFont.setBold(true); // 加粗
        cellFont.setItalic(false); // 设置字体为斜体字

        // 配置单元格样式
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
        cellStyle.setBorderTop(BorderStyle.THICK); // 上边框样式
        cellStyle.setBorderRight(BorderStyle.THICK); // 右边框样式
        cellStyle.setBorderBottom(BorderStyle.THICK); // 下边框样式
        cellStyle.setBorderLeft(BorderStyle.THICK); // 左边框样式
        cellStyle.setFont(cellFont); // 设置单元格字体
        cellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex()); // 设置单元格背景色
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 填充方式
        cellStyle.setWrapText(true); // 设置自动换行

        // 设置表头样式
        for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) {
            Cell cell = row.getCell(i);
            cell.setCellStyle(cellStyle); // 设置单元格样式
            // 设置列宽（单元格的宽读和高度可以通过对注解@ExcelProperty进行扩展，在这里动态读取）
            switch (i) {
                case 6:
                    sheet.setColumnWidth(i, 24 * 256);
                    break;
                case 7:
                    sheet.setColumnWidth(i, 40 * 256);
                    break;
                case 13:
                    sheet.setColumnWidth(i, 30 * 256);
                    break;
                default:
                    sheet.setColumnWidth(i, 20 * 256);
                    break;
            }
        }
    }

    /**
     * 设置Excel单元格样式，合并单元格
     */
    public static void setDefaultContentCellStyle(Sheet sheet) {
        // 获取当前Sheet页所在的工作薄
        Workbook workbook = sheet.getWorkbook();
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
        cellStyle.setWrapText(true); // 设置自动换行

        int lastRowNum = sheet.getLastRowNum();
        for (int i = 0; i <= lastRowNum; i++) {
            if (i <= 0) {
                continue;
            }
            Row row = sheet.getRow(i);
            row.setHeight((short) (24 * 20));
            int physicalNumberOfCells = row.getPhysicalNumberOfCells();
            for (int j = 0; j < physicalNumberOfCells; j++) {
                Cell cell = row.getCell(j);
                if (cell == null) {
                    log.debug("第{}个单元格不存在", j);
                    continue;
                }
                cell.setCellStyle(cellStyle);
            }
        }
    }

    /**
     * 将颜色码 转换为 r g b
     */
    static int[] hexToRgb(String hex) {
        String colorStr = hex;
        if (hex.startsWith("#")) {
            colorStr = hex.substring(1);
        }
        if (colorStr.length() == 8) {
            colorStr = hex.substring(2);
        }
        int r = Integer.valueOf(colorStr.substring(0, 2), 16);
        int g = Integer.valueOf(colorStr.substring(2, 4), 16);
        int b = Integer.valueOf(colorStr.substring(4, 6), 16);

        return new int[]{r, g, b};
    }
// CHECKSTYLE:ON
}
